package br.usp.ime.ingpos.modelo.dao;

import java.util.ArrayList;
import java.util.List;

import org.hibernate.criterion.Restrictions;

import br.com.caelum.vraptor.ioc.Component;
import br.com.caelum.vraptor.ioc.RequestScoped;
import br.com.caelum.vraptor.util.hibernate.SessionCreator;
import br.usp.ime.ingpos.modelo.Usuario;

@Component
@RequestScoped
public class UsuarioDao
    extends
        AbstractDaoImpl<Long,Usuario>
{
    public UsuarioDao(
        final SessionCreator sessionCreator )
    {
        super( sessionCreator );
    }

    public Usuario procurarPorEmail(
        final String email )
    {
        final List<Usuario> usuarios = findByCriteria( Restrictions.eq( "email", email ) );

        if (!usuarios.isEmpty()) {
	        Usuario u = usuarios.remove(0);
	        List<Usuario> users = new ArrayList<Usuario>();
	        users.add(u);
	        usuarios.removeAll(users);
	        usuarios.add(u);
        }
        if( usuarios.size() > 1 ) {
            throw new IllegalStateException( "Existem dois ou mais usuários com mesmo email" );
        }

        if( usuarios.isEmpty() ) {
            return null;
        } else {
            return usuarios.get( 0 );
        }
    }

    public Usuario findByEmailAndPassword(
        final String email,
        final String senha )
    {
        final List<Usuario> usuarios = findByCriteria( Restrictions.and(
            Restrictions.eq( "email", email ), Restrictions.eq( "senha", senha ) ) );

        if (!usuarios.isEmpty()) {
	        Usuario u = usuarios.remove(0);
	        List<Usuario> users = new ArrayList<Usuario>();
	        users.add(u);
	        usuarios.removeAll(users);
	        usuarios.add(u);
        }
        if( usuarios.size() > 1 ) {
            System.out.println(usuarios.get(0).getUsuarioID());
            throw new IllegalStateException(
                "Existem dois ou mais usuarios com mesmo email e senha" );
        }

        if( usuarios == null || usuarios.isEmpty() ) {
            return null;
        } else {
            return usuarios.get( 0 );
        }
    }

    public List<Usuario> procurarCandidatos()
    {
        return findByCriteria( Restrictions.isNotNull( "candidato" ) );
    }

    public Usuario procurarPorId(
        final Long usuarioId )
    {
        List<Usuario> usuarios = findByCriteria( Restrictions.eq( "usuarioID", usuarioId ) );

        if( usuarios.isEmpty() )
            return null;

        return usuarios.get( 0 );
    }

    public Usuario procurarPorHash(
        final String hash )
    {
        List<Usuario> usuarios = findByCriteria( Restrictions.eq( "hash", hash ) );

        if( usuarios.isEmpty() )
            return null;

        return usuarios.get( 0 );
    }
}
